/**
  * @addtogroup 
  * 
  *
  * @brief 
  *
  * @code{c}
  * @endcode
  * @{
  * @file         bsc_electric_fence_channel.h
  * @brief        
  * @note
  * @author       Jpz(puzhao.jin@hopechart，靳普诏)
  * @date         2022-09-22
  * @version      1.0
  * 
  * @par          修改日志
  * <table>
  * <tr><th>Date        <th>Version          <th>Author                        <th>Description
  * <tr><td>2022-09-22  <td>1.0              <td>Jpz                           <td>创建初始版本
  * @copyright    杭州鸿泉物联网技术股份有限公司
  */



#ifndef _BSC_ELECTRIC_FENCE_CHANNEL_H_
#define _BSC_ELECTRIC_FENCE_CHANNEL_H_

#include "bsc_electric_fence/bsc_electric_fence_define.h"
#include "bsc_electric_fence/bsc_electric_fence_zone_data.h"
#include "bsc_electric_fence/bsc_electric_fence_tool_if.h"
#include "bsc_electric_fence/bsc_electric_fence_platform.h"

#include "ofc/ofc_indefine_list.h"

#ifdef __cplusplus
extern "C" {
#endif


typedef struct TBsElectricFenceChannelTag TBsElectricFenceChannel;

/**
 * 函数类型：枚举区域回调函数类型  
 * @param *self         回调通道句柄
 * @param zone_type      区域类型
 * @param *zone_info     区域信息
 * @param zone_size      区域信息大小
 * @param *user_param   用户自定义传参
 * @return 
 */
typedef void (* TBsElectricFenceChannelEnumZoneCallback)(TBsElectricFenceChannel *self, UInt8 zone_type, TBsElectricFenceZoneBaseInfo *zone_info, Int32 zone_size, void *user_param);

struct TBsElectricFenceChannelTag
{
    TBsElectricFencePlatform *platform_;     ///< 平台应用接口集

    /// 当前所在区域id列表，不定长列表
    TOfIndefineList in_zones_[kBsElectricFenceShapeMax];
};


/**
 * 创建通道  
 * @param *self       
 * @param *platform   平台对象句柄
 * @param *location   当前位置信息
 * @return  成功 >= 0;
 *          失败 <  0
 */
Int32 TBsElectricFenceChannelCreate(TBsElectricFenceChannel *self, TBsElectricFencePlatform *platform, TBsElectricFenceMoveStatus *location);

/**
 * 析构通道
 * @param *self
 * @return 
 */
void TBsElectricFenceChannelDestroy(TBsElectricFenceChannel *self);


/**
 * 处理当前运动状态与该平台设定区域之间的关系
 * @param *self
 * @param *curr_move_status 当前位置信息
 * @param *tool_if          框架工具接口集
 * @return 
 */
void TBsElectricFenceChannelRunOnce(TBsElectricFenceChannel *self, TBsElectricFenceMoveStatus *curr_move_status, IBsElectricFenceToolIf *tool_if);

/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 属性方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/**
 * 获取平台对象句柄
 * @param *self
 * @return 平台对象句柄
 */
TBsElectricFencePlatform *TBsElectricFenceChannelPlatformHandler(TBsElectricFenceChannel *self);


/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 枚举区域方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */

/**
 * 枚举当前所在区域  
 * @param *self         
 * @param zone_type      区域类型
 * @param callback      枚举回调函数
 * @param *user_param   用户自定义参数
 * @return 成功 >= 0,   N个复合条件区域个数,触发N次回调函数
 *         失败 <  0
 */
Int32 TBsElectricFenceChannelEnumLocationZones(TBsElectricFenceChannel *self, UInt8 zone_type, TBsElectricFenceChannelEnumZoneCallback callback, void *user_param);

/**
 * 枚举平台下发的全部区域信息  
 * @param *self         
 * @param zone_type      区域类型
 * @param callback      枚举回调函数
 * @param *user_param   用户自定义参数
 * @return 成功 >= 0,   N个复合条件区域个数,触发N次回调函数
 *         失败 <  0
 */
Int32 TBsElectricFenceChannelEnumZoneItems(TBsElectricFenceChannel *self, UInt8 zone_type, TBsElectricFenceChannelEnumZoneCallback callback, void *user_param);





#ifdef __cplusplus
}  ///< extern "C" {
#endif


#endif

